<?php
/**
 * Класс начальной инциализации системы.
 */
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
	/**
	 * Инициализация общих настроек.
     *
     * В Zend_Registry регистрируются следующие ключи:
     *
     * bootstrap    - текущий объект Bootstrap приложения
     *
     * cacheManager - ресурс для работы с кешем
     *
     * configPath   - путь к папке с конфигами приложения
     *
     * debug_mode   - режим отладки (включен/выключен)
     *
	 */
	protected function _initSettings() {

        Zend_Registry::set('bootstrap', $this);
		Zend_Registry::set('configPath', APPLICATION_PATH.'/configs/');
        Zend_Registry::set('debug_mode', $this->getOption('debug_mode'));

        //Настройка менеджера кешей.
        $this->bootstrap('cachemanager');
        $cacheManager = $this->getResource('cachemanager');
        Zend_Registry::set('cacheManager', $cacheManager);

		//Базовый путь к статическим файлам
		Workset_File_Info::addBasePath(DOCUMENT_ROOT);

        //пути для фильтров
        Zend_Filter::addDefaultNamespaces(array(
           'Workset_Filter' 
        ));

        if (true == $this->getOption('enablePluginLoaderCache')) {
            $classFileIncCache = APPLICATION_PATH . '/data/pluginLoaderCache.php';

            if (file_exists($classFileIncCache)) {
                include_once $classFileIncCache;
            }

            Zend_Loader_PluginLoader::setIncludeFileCache($classFileIncCache);
        }

	}

    /**
     * Инициализация объекта логирования работы.
     */
    protected function _initLogBootstrap() {
        if ($this->getOption('debug_mode') && $this->hasPluginResource('log')) {
            $this->bootstrap('log');
            Zend_Registry::set('logger', $this->getResource('log'));
        }
    }

	/**
	 * Инициализация адаптера соединения с базой данных.
	 */
	protected function _initDbBootstrap() {

		// Задаём адаптер по умолчанию.
		$db = $this->getPluginResource('db')->getDbAdapter();

		// Если необходимо задать кодировку явно
		//$db->query('SET NAMES utf8;');

		Zend_Registry::set('dbAdapter', $db);
		Zend_Db_Table::setDefaultAdapter($db);

		// Регистрируем кэш для хранения метаданных таблиц.
        $metadataCache = Zend_Registry::get('cacheManager')->getCache('metadata');
		Zend_Db_Table_Abstract::setDefaultMetadataCache($metadataCache);
	}

    /**
     * Инициализация локали и перевода
     */
    protected function _initLocaleBootstrap() {
        // Кеш для языковых файлов
        $defaultCache = Zend_Registry::get('cacheManager')->getCache('default');
        Zend_Translate::setCache($defaultCache);

        // Инициализация транслятора
        $this->bootstrap('translate');
        if (Zend_Registry::isRegistered('Zend_Translate')) {
            Workset_Form::setDefaultTranslator(Zend_Registry::get('Zend_Translate'));
        }

		$locale = $this->getOption('default_locale');
		Zend_Registry::set('Zend_Locale', Zend_Locale::findLocale($locale));

        Zend_Registry::get('Zend_Translate')->setLocale($locale);
    }

	/**
	 * Инициализация контроллера.
	 */
	protected function _initControllerBootstrap() {
		// Получаем и настраиваем FrontController.
		$this->bootstrap('FrontController');
		$front = $this->getResource('FrontController');

		$useDefaultControllerAlways = (bool)$this->getOption('useDefaultControllerAlways');
		$front->setParam('useDefaultControllerAlways', $useDefaultControllerAlways);

		$prefixDefaultModule = (bool)$this->getOption('prefixDefaultModule');
		$front->setParam('prefixDefaultModule', $prefixDefaultModule);

		// Создаём и регистрируем объекты запроса и ответа.
		$req = defined('CRON_JOB') && CRON_JOB
            ? new Zend_Controller_Request_Simple()
            : new Zend_Controller_Request_Http(); 
		$front->setRequest($req);

		$response = defined('CRON_JOB') && CRON_JOB
			? new Zend_Controller_Response_Cli()
			: new Zend_Controller_Response_Http();
		$front->setResponse($response);

		//$front->setParam('disableOutputBuffering', true);

		// Устанавливаем стандарный content-type
		$response->setRawHeader('Content-Type:text/html; charset='.$this->getOption('encoding'));

		// Задаём путь к системным помошникам действий (общим для всех модулей).
		Zend_Controller_Action_HelperBroker::addPrefix('Workset_Controller_Action_Helper');

		// Инциализация путей к модулям.
		$this->bootstrap('modules');

	}

	/**
	 * Инициализация отображения.
	 */
	protected function _initViewBootstrap() {
		$view = null;
		if ($this->hasPluginResource('view')) {
			$this->bootstrap('view');
			$view = $this->getPluginResource('view')->getView();
		}

		// Инициируем пустой View для рендеринга шаблонов.
		if ($view === null) {
			$view = new Zend_View();
			$view->module = 'default';
		}

        $front = $this->getResource('FrontController');

        if ($front->getRequest() instanceof Zend_Controller_Request_Http && $front->getRequest()->isXmlHttpRequest()) {
            $this->unregisterPluginResource('layout');
        }

		// Добавим директорию с помошниками вида.
		$view->addBasePath(APPLICATION_PATH.'/views');
		$view->addHelperPath(APPLICATION_PATH.'/views/helpers', 'Application_View_Helper');
		$view->addHelperPath(APPLICATION_PATH.'/../library/Workset/View/Helper', 'Workset_View_Helper');

        //настройки Jquery
        if ($this->getOption('enablejquery')) {
            ZendX_JQuery::enableView($view);
            $view->JQuery()->setLocalPath($this->getOption('jquerypath'))
                           ->setUiLocalPath($this->getOption('jqueryuipath'))
                           ->addStylesheet($this->getOption('jqueryuistylesheet')); 

            if ($this->getOption('jQuerynoconflictmode')) {
                ZendX_JQuery_View_Helper_JQuery::enableNoConflictMode();
            }
        }


		$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
		$viewRenderer->setView($view);

		Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

		// Добавим значения переменных для view из конфига
		if ($viewVars = $this->getOption('defaultVars')) {
			if (is_array($viewVars)) {
				foreach ($viewVars as $key => $value) {
					$view->$key = $value;
				}
			}
		}

		return $view;
	}

	/**
	 * Инициализация объектов для работы с правами доступа.
	 */
	protected function _initAccessBootstrap() {
		if ($this->hasPluginResource('access')) {
			$this->bootstrap('access');
			Zend_Registry::set('acl', $this->getPluginResource('access')->getAcl());
		}
	}

	/**
	 * Инициализация объекта авторизованного пользователя.
	 */
	protected function _initAuthBootstrap() {
		try {
			Zend_Session::start(true);
		} catch (Exception $oException) {
			Zend_Session::isRegenerated() || Zend_Session::regenerateId();
			$_COOKIE = array();
		}

		Zend_Session::registerValidator(new Workset_Session_Validator_Network());
		Zend_Session::registerValidator(new Workset_Session_Validator_Browser());
		Zend_Session::registerValidator(new Workset_Session_Validator_OneUser());

		if ($this->hasPluginResource('auth')) {
			$this->bootstrap('auth');
			Zend_Registry::set('auth', $this->getPluginResource('auth')->getAuth());
		}
	}
}